<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 概念：函数提升与变量提升比较类似，是指函数在声明之前即可被调用
    // 1.会把所有函数声明提升到当前作用域的最前面
    // 2.只提升函数声明，不提升函数调用

    /* 相当于这样子，还是相当于原逻辑   先声明后调用
    function fn() {
      console.log('声明之前即被调用...')
    } */
    fn()
    function fn() {
      console.log('声明之前即被调用...')
    }


    // 但是：
    // 函数表达式 必须先声明和赋值， 后调用 否则 报错
    /* 相当于var fun，这样fun都不知道是什么，下面怎么调用
    fun()  // 错误  函数未声明，怎么调用
    var fun = function () {   // 这种写法实际上是赋值，而不是声明函数
      console.log('函数表达式不存在提升现象...')
    } */



    // 总结：
    // 1.函数提升能够使函数的声明调用更灵活
    // 2.函数表达式不存在提升的现象
    // 3.函数提升出现在相同作用域当中
  </script>
</body>

</html>